package org.zxp.thread.ccontainer;

import org.junit.Test;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * @program: zxp-thread-test
 * @description: LinkedBlockingQueue测试
 * @author: X-Pacific zhang
 * @create: 2019-05-24 12:38
 **/
public class LinkedBlockingQueueTest {
    public static void main(String[] args) throws InterruptedException {
        //LinkedBlockingQueue是一个FIFO(先进先出) 并通过Lock实现的线程安全的阻塞队列
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue(2);
        //add队列满抛异常（实际上调用的是offer）
        queue.add("1");queue.add("2");queue.add("3");
        //offer队列满返回false什么都不做
        queue.offer("1");queue.offer("2");queue.offer("3");
        System.out.println(queue.size());
        //put队列满阻塞
        queue.put("1");queue.put("2");queue.put("3");

        //从队列头部取出元素
        queue.put("1");
        String entry = queue.remove();System.out.println(entry);
        //remove 为空时抛异常（实际上调用的是poll）
        queue.remove();
        //poll 为空时返回false什么都不做
        queue.poll();
        //take 为空时阻塞
        queue.take();
    }


    @Test
    public void testThreadSafe() throws InterruptedException {
        //测试线程安全性
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue(1000);
        for (int i = 0;i < 1000;i++){
            new Thread(() -> {
                queue.add("i");
            }).start();
        }
        Thread.sleep(1000L);
        System.out.println(queue.size());//结果为是线程安全的
    }
}
